import time  # 导入时间模块，用于控制滚动和等待时间
from selenium import webdriver  # 导入selenium webdriver模块
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By  #

driver = webdriver.Chrome()


# 定义函数，用于滚动页面
def scroll_to_bottom():
    js = "return action= document.body.scrollHeight"  # js代码，用于获取页面高度
    height = 0  # 初始化滚动条所在高度
    new_height = driver.execute_script(js)  # 执行js脚本
    while height < new_height:
        # 滚动页面，每次滚动200像素
        for i in range(height, new_height, 200):
            driver.execute_script('window.scrollTo(0,{})'.format(i))
            time.sleep(0.5)  # 等待0.5秒，确保页面加载
        height = new_height  # 更新已经滚动的高度
        time.sleep(0.5)
        new_height = driver.execute_script(js)  # 执行js脚本
        if condition():  # 如果满足终止条件，则跳出循环
            break


# 终止条件函数，用于判断是否滚动到了指定的元素
def condition():
    try:
        # 尝试查找页面中的第200部电影，如果找到表示已经滚动到底部了
        driver.find_element(By.XPATH, '//*[@id="content"]//div[200]')
        return True  # 如果找到返回True
    except:
        return False  # 未找到返回False


if __name__ == '__main__':
    service = Service("d:/chrome-win64/chromedriver.exe")
    driver = webdriver.Chrome(service=service)
    # 请求豆瓣电影排行榜-》剧情片
    driver.get("https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=")
    scroll_to_bottom()  # 调用滚动页面的函数
    # 查找页面中具有'movie-name-text'类名的元素，即电影名称元素
    # 获取前200部电影名称
    movieList = driver.find_elements(By.CLASS_NAME,
                                     'movie-name-text')[:200]
    i = 1  # 初始化计数器
    # 写入文件
    with open('movie200.txt', 'w', encoding='utf-8') as f:
        for movie in movieList:  ## 遍历电影名称列表
            f.writelines("NO:{} {}\n".format(i, movie.text))  # 写入电影编号和名称
            i += 1  # 计数器加1
    time.sleep(1)
    driver.quit()
